package com.yc.collections.myListDemo;

/**
 * Title: 单链表的实现<br>
 * Description: <br>
 * Author:陈圆(chenyuan@bosssoft.com.cn) <br>
 * Date:2020/8/11
 */
public class SingleList {
    /***
     * 单链表实现增，删，修改和遍历
     */

    // 自定义一个头节点
    private Node headNode = new Node(0, "");

    // 获取头节点
    public Node getHeadNode() {
        return headNode;
    }

    //添加节点到单向链表
    //思路，当不考虑编号顺序时
    //1. 找到当前链表的最后节点
    //2. 将最后这个节点的next 指向 新的节点

    public void addNode(Node newNode) {
        Node temp = headNode;
        while (true) {
            // 找到了链表的最后 breaK
            if (temp.next == null) {
                break;
            }
            // 没有找到最后就一直后移
            temp = temp.next;
        }
        temp.next = newNode;
    }

    // 通过编号有序加入元素，若元素存在则不加入并给出提示
    public void addNodeOrderByNo(Node newNode) {
        Node temp = headNode;
        boolean flag = false; // 标识是否能添加进去
        while (true) {
            if (temp.next == null) {
                break ;
            }

            if (temp.next.no > newNode.no) {
                break;
            } else if (temp.next.no == newNode.no) {
                flag = true; // 说明编号存在
                break;
            }
            // 向后移，需要考虑几种情况
            temp = temp.next;
        }
        if (flag) {
            System.out.println("编号已经存在，不能重复添加");
        } else {
            // 需要注意的地方！！！！
            // 把新插入的节点的next指向原来的下一个
            newNode.next = temp.next;
            // 把新插入之前的节点的next指向新节点
           temp.next = newNode;
        }
    }

    // 根据编号修改node元素
    public void updateNode(Node newNode) {
        Node next = headNode.next; // 获取头节点的下一个节点
        boolean flag = false; // 定义一个找到对应编号的节点的标识
        while (true) {
            if (next == null) { break; }
            if (next.no == newNode.no) {
                // 说明已经找到了对应编号的节点，则表示可以进行修改操作
                flag = true;
                break;
            }
            next = next.next;
        }
        if (flag) {
            next.name = newNode.name;
        } else {
            System.out.println("未找到对应节点的node");
        }
    }
}


class Node {
    int no; // 编号
    String name; // 名称
    Node next; // 下一个节点

    public Node(int no, String name) {
        this.no = no;
        this.name = name;
    }
}
